March 07, 2021
ํ์ด๋ ํ๋ก์ ํธ๋ฅผ ์์ํ ์ง ์ด์ 3์ฃผ ์ฐจ ๋ฅผ ๋์ด๊ฐ๊ณ ์๋ค.
์ฌ๋ฌ ํฌ๊ณ ์์ ์ด๋ ค์๊ณผ ๋ฌธ์ ํด๊ฒฐ์ ๋ด์ ์ฌํญ์ ๋งค์ผ ์ ๋ฆฌ ํ๊ธฐ์๋ CSS ์ ๊ธฐ๋ฅ๊ตฌํ์ ๋น ๋ฏํจ(?)์ด ๋๋ฅผ ๊ทธ๋ฆฌ๊ณ ๋ด ์ค์ค๋ก๋ฅผ ๋งค์ผ๋งค์ผ ๋ชฐ์๋ถ์๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐ์ง ๋ชปํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด ์นด์นด์ค ๋ก๊ทธ์ธ์ ๊ทธ๋ฅ ๋๊ธธ ์ ์์ด์ ๋ธ๋ก๊ทธ๋ฅผ ์จ์ผ๋ง ํ๊ฒ ๋ค.
์์ธํ ๊ณต์ ๋ฌธ์์ ๋ด์ฉ์
https://developers.kakao.com/docs/latest/ko/kakaologin/prerequisite
์ ์ ์๊ฐ๋์ด ์๋ค.

๊ณต์ ๋ฌธ์์ ์๋ ํด๋น ์ด๋ฏธ์ง๊ฐ ๊ณผ์ ์ ์ ์ค๋ช ํด ์ฃผ๊ณ ์๋ค.
๋น๋ก ์ฝ์ง? ์ ์กฐ๊ธ ์ฌํ๊ฒ ํ์ง๋ง, ํ๋ก ํธ ์๋์ ์ ์ฅ์์ ์นด์นด์ค ์๋ฒ์ ์ธ์ฆ ์ฝ๋๋ฅผ ์์ฒญํ๊ณ ,
๊ทธ ์ธ์ฆ์ฝ๋๋ฅผ ๋ฐ์์ ๋ฐฑ์๋์ ์๋ฒ๋ก ์ ๋ฌํด์ฃผ๋ฉด ์ด์ ๋ฐฑ์๋ ์์๋ ํด๋น ์ธ์ฆ์ฝ๋๋ก ์นด์นด์ค์ ํ ํฐ์ ์์ฒญํ๊ณ ,
ํ๋ก ํธ์๋์์๋ ์ด์ ๋น๋ก์ ์๋ต์ผ๋ก accesstoken ๊ณผ refreshtoken ์ ๋ฐ๊ฒ ๋๊ณ ํ ํฐ ์ ํจ์ฑ ํ์ธ์ ํตํด
๋น๋ก์ ์นด์นด์ค ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๊ฒ ๋๋ ๊ณผ์ ์ด๋ค.
์นด์นด์ค ๋ก๊ทธ์ธ ๊ตฌํ์ ํ๊ธฐ ์ํด ์ค์ ํ๋ ๊ณผ์ ์ ์ด๋ฏธ ์งํ๋์ด์ ์๋ ๋งํฌ๋ก ๋์ ํ๋ค.
https://developers.kakao.com/docs/latest/ko/kakaologin/prerequisite
๋๋ ์๋ฐ์คํฌ๋ฆฝํธ SDK ๋ฅผ ์ด์ฉํ ์นด์นด์ค ๋ก๊ทธ์ธ ๊ตฌํ ๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ์งํํ๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ โRest API ๋ฅผ ์ด์ฉํ ์นด์นด์ค ๋ก๊ทธ์ธโ ์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ์งํํ๋ ๊ฒ์ด ํฌ์ธํธ์๋ค.
๋ฐฑ์๋ ๋ถ๋ค์ด ์ด์ฌํ ์ค๋ช ํด ์ฃผ์ จ๋ ๊ฑฐ ๊ฐ์๋ฐ ์ ๋๋ก ๋ฃ์ง ๋ชปํ๋ ๊ฒ ์ผ๋จ ์ฒซ๋ฒ์งธ ์ฝ์ง์ ์์์ด ๋์๋ค.
์ฌํผ https://developers.kakao.com/docs/latest/ko/getting-started/sdk-js ๋งํฌ๋ฅผ ๋ณด๋ฉด์
๋จผ์ React ๋ด public ํด๋ ์์ ์๋ index.html ๋ด head ํ๊ทธ์ ๋ค์์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
<script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
<script>
Kakao.init('939d6088cefbb5aaceb178768be8be0c')
console.log(Kakao.isInitialized())
</script>์ด๋ ๊ฒ ์์ํ๋ ์ด์ ๋ฅผ ๋ค์ ๋ ์ฌ๋ ค ๋ณด๋๊น, ๋๋ ์ด์ ์ ์นด์นด์ค ๋ก๊ทธ์ธ์ ์๋ํด ๋ณธ์ ์ด ์์ด์์๋ค.
ํ์ง๋ง ๊ทธ ๋๋ ๋ด๊ฐ ์ผ๋ Kakao SDK for JavaScript ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์ ์ด์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋์ ์ฝ๋๋ฅผ ๋ง๋ค๊ณ
const loginWithKakao = () => {
window.Kakao.Auth.login({
success: authObj => {
console.log(authObj)
axios('http://localhost/users/kakao', {
method: 'POST',
headers: {
Authorization: authObj.access_token,
},
})
.then(res => res.json())
.then(res => {
if (res.token) {
localStorage.setItem('CC_Token', res.token)
console.log('๋ก๊ทธ์ธ ๋์์ต๋๋ค.')
history.push('/')
} else {
console.log('๋ค์ ํ์ธํด ์ฃผ์ธ์.')
}
})
},
fail: function(err) {
console.log('์๋ฌ', err)
},
})
}onClick ์ด๋ฒคํธ๋ก ๋ง๋ค์ด ๋์ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฒํผ์ loginWithKakao ํจ์๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ฉด ๊ทธ๋๋ก ๋๋๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
ํ์ง๋ง ๊ทธ๋ ์ง๊ฐ ์์๋ค.
์ค? ๋ก๊ทธ์ธ ์ฐฝ์ด ๋จ๋ค? ์ค ๋๋๋ณด๋ค ํ๊ณ ๋ ๋ค ๋ก๊ทธ์ธ์ ์๋ํ๋ค. ํ์ง๋ง ๊ทธ ์ดํ์ ์๋ฌด์ฐฝ๋ ๋จ์ง ์์๋ค.
axios ๋ก ์๋ฒ ์๋ํฌ์ธํธ๋ก ์์ฒญ์ ํ์ผ๋ ์๋ต์ด ์ค๊ฑฐ๋ ์๋ฌ ๋ฉ์์ง๊ฐ ์์ผ ํ๋๋ฐ, ์ฝ์ ๋ก๊ทธ๋ก ํ์ธํด ๋ณด๋
์์ ์๋ต ์์ฒด๊ฐ ๋์ง ์์๊ณ , ๋ฐฑ์๋์์์ ์๋ฒ ์ฝ๋๋ฅผ req.query ๊ฐ ์ ๋ชป ๋์๋ ์ถ์ด์ req ๋ก console.log ๋ฅผ ์ฐ์ด์
ํ์ฐธ์ ํ์ธํด ๋ณด์๋ค.
์์ ์ฝ๋ ํฌ๋งท์์ ํฌ๊ฒ ๋ฒ์ด๋์ง ์๊ณ ๋ญ๊ฐ๋ฅผ ์์ ํ๋ค ๋ณด๋๊น 401 ์๋ฌ๊ฐ 400 ์๋ฌ๋ก ๋ฐ๋๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค.
๋ด๊ฐ ๋ณด๋ธ access_token ์ด ์๋ฒ ํค๋์ Authorization ์ ๋ค์ด๊ฐ๊ธฐ๋ ํ๋ค.
์ฌํผ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ชป๋ ์ ๊ทผ์ด์์ง๋ง,
https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting
์ธ๊ฐ ๊ด๋ จ ์ฝ๋ ์๋ฌ์ ๋ํ ๋ด์ฉ์ ๋๋ถ์ ์ ๋ณด๊ณ ์ฐพ์ ๋ณผ ์ ์๊ธฐ๋ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐค๋ฆ๊ฒ (์ฌ์ค์ ์๋ฒฝ) ํ๋ค๊ฐ ์ง์ณ ๋จ์ด์ ธ ๋๊ฐ ๋์ฏค ๋ด๊ฐ ์งํํ ๋ฐฉ์์ด ์๋ชป๋์๋ค๋ ๊ฒ์ ๋๊ผ๋ค.
ํ ํ๋ก์ ํธ ๊ด๋ จ ๋ ธ์ ํ์ด์ง์ ํ์๋ถ๊ป์ ์น์ ํ ์ค๋ช ํด ๋์ ๊ธ์ ์ด ๋ ๋ณด๊ณ ํ์์ ํ๋ค.
REST API ๋ก ๊ตฌํํ๋ ์นด์นด์ค ๋ก๊ทธ์ธ์ด์์ด์ผ ํ๋ค.
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
์ด ๋งํฌ๋ฅผ ์์ฃผ๋ก ์ฐธ๊ณ ํด์ ์งํํ์ด์ผ ํ๋ ๋ถ๋ถ์ด๋ผ๋ ๋ป์ด์๊ณ ๋๋ ์๊พธ access_token ์ ๋ณด๋ด๋ ค ํ์ง๋ง,
ํ ํฐ์ด ์๋๋ผ ์นด์นด์ค ์๋ฒ์ โ์ธ์ฆ ์ฝ๋โ ๋ฅผ ์์ฒญํ๊ณ ์๋ต์ผ๋ก ๋ฐ์์ ๋ฐฑ์๋ ์๋ฒ์ ์ ๋ฌํด ์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์๋ค.
https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=1234567890abcdefghijklmnopqrstuvw&redirect_uri=http://localhost:3000/signin์ ์ฝ๋์์ client_id ๋ โ๋ด ์ ํ๋ฆฌ์ผ์ด์ > ์ฑ ์ค์ > ์ฑ ํคโ ์ ์๋ REST API ํค ์ด๋ค.
ํ์๋ถ๊ป์ ๊ฒ์ํด ๋ณด์ จ๋๋ฐ, ํด๋น ํค๋ ๊ณต๊ฐ๊ฐ ๋์ด๋ ๊ด์ฐฎ๋ค๊ณ ํ๋ค.
๋ฌดํผ ์์ ๋งํฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ฉด ์นด์นด์ค ๋ก๊ทธ์ธ ํ์ด์ง๊ฐ ๋์จ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ์ธ์ ํ๊ณ ๋๋ฉด,
localhost:3000/login?code=ASKDJASIN12231KNsakdasdl1210SSALadk5234์์ ๊ฐ์ด ์ฃผ์๊ฐ ๋ฐ๋๋๋ฐ ๋ฐ๋ก ์ code= ๋ค์ ์๋ ๊ฒ๋ค์ด โ์ธ์ฆ ์ฝ๋โ ์ด๋ค.

์ ๊ทธ๋ผ ์ ์ธ์ฆ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์ฌ๊น?
window.location.href ๋ ํ์ฌ ๋ธ๋ผ์ฐ์ ์ URI ์ฃผ์๋ฅผ ๋ถ๋ฌ์จ๋ค.
๋ค์ดx ์์ ๊ฐ๋ฐ์ ๋๊ตฌ์ window.location.href ๋ฅผ ์น๋ฉด ํด๋น ์ฃผ์๊ฐ ๋์จ๋ค.
ํ์ ๋ถ๊ป์ ์น์ ํ ์ฐพ์์ฃผ์ ์ ๊ทธ ์กด์ฌ์ ๋ํด ์๊ฒ ๋์๊ณ ์ถ๊ฐ ๊ฒ์์ ํด ๋ณด์๋ค.
https://developer.mozilla.org/ko/docs/Web/API/URL/URL
URL() ์์ฑ์๋ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณตํ URL์ ๋ํ๋ด๋ ์๋ก์ด URL ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ๋ผ๊ณ ์ค๋ช ๋์ด ์๋ค.
https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=1234567890abcdefghijklmnopqrstuvw&redirect_uri=http://localhost:3000/signin์ ์ฃผ์๋ฅผ ์ง์ ๋ณต์ฌํด์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ๋ก๊ทธ์ธ ์ฐฝ์ด ๋์ค๊ณ , ํด๋น ํ๋ฉด์์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด
let requestURL = new URL(window.location.href)์์ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ ํ์ธํด ๋ณด๋ฉด ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
์์ ์ด๋ฏธ์ง์์ ๋ณด๋ฏ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ํ์ธํด ๋ณด์์ ๋, ์ด์ new URL ์ด๋ผ๋ ํด๋น ์ธ์คํด์ค ์์
โsearchโ ๋ผ๋ ํค์ ์ฃผ๋ชฉํด์ผ ํ๋ค.
์ด์ ๋ก๊ทธ์ธ์ ํ๊ณ ๋ ๋ค ๋ฐ๋๋ URL ์์ โ์ธ์ฆ ์ฝ๋โ ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ๋๋ split ์ ์๊ฐํด ๋๋ค.
new URL(window.location.href).search.split('=')[1]๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ํ์๋ถ๊ป์๋ ๋ ์ข์ ์ ์์ ํด์ฃผ์ จ๋ค. ๊ทธ๊ฒ์,
new URL(window.location.href).searchParams.get('code')new URL ์ธ์คํด์ค์ ์์ธํ ๋ณด๋๊น searchParams ๋ผ๋ ํค๊ฐ ์์๊ณ , get(โcodeโ) ๋ฅผ ํตํด code ๋ค ๋ฌผ์ํ ํ๋ผ๋ฏธํฐ ๋ค์ ์๋ ๋ด์ฉ์ ๋ชจ๋ ๊ฐ์ ธ์ค๋ ๊ฒ์ด์๋ค.
์คํธ ์ข์์ผ! ์ด์ ๊ฐ์ ธ์์ผ๋ ๊ทธ๋๋ก ์ด ์ฝ๋๋ฅผ ๋ฐฑ์๋ ์๋ฒ๋ก ๋ณด๋ด๋ฉด ๋๊ฒ ๊ตฐ?
์๋.. ์์ง ํ ๋ฐ ๋ ๋จ์๋ค.

์ผ๋จ ๋ด ๋ฆฌ์กํธ์ ์ฝ๋๋ ๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์ , ์นด์นด์ค๋ก๊ทธ์ธ์ด ๋ชจ๋ ์๋ SignInUp ์ด๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์๊ณ
ํ์ ์์ ์ปดํฌ๋ํธ๋ก SignIn, SignUp ๋ฑ์ด ์๋๋ฐ ์นด์นด์ค ๋ก๊ทธ์ธ์ ์งํํ๋ SocialLogin ์ปดํฌ๋ํธ ๋ํ ๋ง๋ค์ด์ ธ ์์๋ค.
์ด ๋ถ๋ถ์ด ์์ง ๋ช ํํ ์ดํด๊ฐ ๋์ง ์์ง๋ง,
์์ ์ปดํฌ๋ํธ์ธ SocialLogin ์์ axios ๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ์ ๋ฃ๋ ์๋๋ฅผ ํ์๊ณ ๋ถ๋ช ์ธ์ฆ ์ฝ๋๋ฅผ ๋ฃ์ด์ ์ ๋ฌํ๋๋ฐ!
console.log ์๋ ์ธ์ฆ ์ฝ๋๊ฐ ์ ํ ์ฐํ์ง ์์๋ค.
์นด์นด์ค ๋๋ฒจ๋กํผ์ Redirect URL ์ค์ ์ SignInUp ์ปดํฌ๋ํธ๋ก ์ฐ๊ฒฐ ๋๋ ์ฃผ์๋ก ํด๋์๋ค.
http://localhost:3000/signin
์๊ฐํด๋ณด๋, ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด ์นด์นด์ค ๋ก๊ทธ์ธ์ ์๋ํ๋ฉด Redirect URL ์ธ
// localhost:3000/signin
<Route path="/signin" component={SignInUp} />๋ก ์ด๋๋๊ณ ๊ฑฐ๊ธฐ์์ (๋ฆฌ์กํธ์ SignInUp ์ปดํฌ๋ํธ) ์ธ์ฆ ์ฝ๋๋ฅผ ๋ฐ์ ์ ์๋ ๊ฒ์ธ๋ฐ,
๋๋ ๊ณ์ SignInUp ์ปดํฌ๋ํธ์ ์์ ์์์ธ SocialLogin ์ปดํฌ๋ํธ์์ ์๊พธ ์์ฒญ์ ๋ณด๋ด๋ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค /signin ์ผ๋ก
๋ฆฌ๋ค์ด๋ ํธ ๋๋๋ฐ ์ธ์ฆ ์ฝ๋๊ฐ ์ฝ์ ๋ก๊ทธ์ ์ฐํ ๋ฆฌ๊ฐ ์์๋ค.
๊ทธ๋ผ ์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํด ๋ณผ๊น ํ๋ค๊ฐ ํ์ ๋ถ๊ป์ window.location.assign() ์ด๋ผ๋ ๊ฒ์ ์ฐพ์ ์ฃผ์ จ๋ค.
์ด ์ฝ๋๋ ๊ฐ๋ฐ์ ๋๊ตฌ์์
window.location.assign(โhttp://www.google.comโ) ์ด๋ผ๊ณ ์น๋ฉด
๊ตฌ๊ธ ๋ก ์ด๋์ด ๋๋, ์ฆ ํด๋น url ํ์ด์ง๋ฅผ ๋ก๋์ํค๋ ์ฝ๋์ด๋ค.
SignInUp Component - SocialLogin ๋ก ๋ด๋ ค๊ฐ๋ ๊ณ์ธต ์ปดํฌ๋ํธ ๊ตฌ์กฐ์์
SocialLogin ์ปดํฌ๋ํธ ๋ฅผ ์๋์ ๊ฐ์ ์ฝ๋๋ก ๊ณ ์ณค๋ค.
const SocialLogin = () => {
const kakaoApi = `https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=1234567890abcdefghskldlasdlksalk&redirect_uri=http://localhost:3000/signin`
const kakaoLoginHandler = () => {
window.location.assign(kakaoApi)
}
return (
<div className="social-login">
<h1>Want Social Login?</h1>
<button className="kakao-btn" type="button" onClick={kakaoLoginHandler}>
<span className="btn-active">Login with kakao</span>
</button>
</div>
)
}์ ์ด์ โLogin with kakaoโ ๋ฒํผ์ ๋๋ฅด๋ฉด ์๊น ์ฐ๋ฆฌ๊ฐ ์ฃผ์์ฐฝ์ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐํด์ ์นด์นด์ค ๋ก๊ทธ์ธ์ฐฝ์ ๋ณผ ์ ์์๋ ๊ฒ๊ณผ ๋๊ฐ์ด ์งํํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋์ API ๋ก ์์ฒญ์ ํ๋ ๊ฒ์, ์นด์นด์ค ๋๋ฒจ๋กํผ์์ ์ค์ ํ Redirect URL ์ด ์์นํ โSignInUpโ ์ปดํฌ๋ํธ์์ ์งํํด์ผ ํ๋ค!
๋น๋๊ธฐ์ Syntactic Sugar ์ธ async, await ์ ์ ์ ํ ์ฌ์ฉํ ์๋์ ์ฝ๋์ด๋ค.
์ด๋ก์จ ์นด์นด์ค ๋ก๊ทธ์ธ์ ๊ตฌํํด ๋ณผ ์ ์์๋ค.
useEffect(async () => {
const getAccessToken = async authorizationCode => {
let tokenData = await axios
.post('http://localhost:4000/users/kakao', {
authorizationCode,
})
.then(res => {
// console.log(res.data);
let accessToken = res.data.accessToken
let refreshToken = res.headers['refresh-token']
localStorage.setItem('CC_Token', accessToken)
localStorage.setItem('RF_Token', refreshToken)
history.push(`/mypage`)
})
}
const url = new URL(window.location.href)
const authorizationCode = url.searchParams.get('code')
// console.log('์ธ์ฆ ์ฝ๋', authorizationCode);
if (authorizationCode) {
await getAccessToken(authorizationCode)
}
}, [])ํ์ ๋ถ๋ค๊ณผ๋ ์๋ ์ํต์ด ์ ๋๋ค๊ณ ๋๊ผ์ง๋ง ๋ค์ ํ ๋ฒ ๊ฐ์ด ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ์งํ ํ ๋ ํ์ ๋ถ๋ค์ ๋ด์ฉ์ ์ ๊ท๋ด์ ๋ค์ด์ผ ๊ฒ ๋ค๋ ์๊ฐ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ถ๋ช ์ฝ์ง์ด ์์๊ณ ํด๊ฒฐํ์ง ๋ชปํ๋ ์๊ฐ์ด ์์์ง๋ง ๋ค๋ฅธ ๋ฐฉ๋ฉด์ ๋ํด ๋ฐฐ์ ๋ณผ ์ ์์๋ ์๊ฐ์ด ๋์๋ ๊ฑฐ ๊ฐ๋ค.
๋ํ ํญ์ ์ด๋ค ์๊ฐ์ด๋ ๊ณํ์ด ํญ์ ๋ค ๋ง์ง ์๋๋ค๋ ๊ฒ์ ์ผ๋์ ๋๊ณ ๊น์ด ๋ค์ด๊ฐ์ ๋ ์ค์ค๋ก ์ธ์งํ๊ณ ๋น ์ ธ ๋์ฌ์ค ์๋ ์์ผ ๋ํ ๊ธธ๋ฌ์ผ ํ ๊ฑฐ ๊ฐ๋ค.
๋ง์ง๋ง์ผ๋ก,
์ค๋๋ง์ ๋ฌ๋ฌํ ์๋ฃ๋ฅผ ๋ง๋ณด๊ฒ ๋์ด์ ๋๋ฌด ์ข์๋ค. ใ ใ ๋จ ๊ฑธ ๋จน์ผ๋๊น ๋จธ๋ฆฌ๋ ๋ ์ ๋์๊ฐ๋ ๋ฏ ํ๋ค!
๊ฐ์ฌํฉ๋๋ค ๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐